AWS ParallelCluster 3.0.0 と Ubuntu 18.04 または Ubutu 20.04 の組み合わせはヘッドノード再起動後にコンピュートノードが起動できない原因と対処方法について
AWS ParallelCluster 3.0.0 と Ubuntu 20.04の組み合わせのクラスターで検証していました。以前はジョブを登録するとコンピュートノードが正常に起動してたのに、ヘッドノードを再起動後するとコンピュートノードが起動しなくなりました。原因と対処方法がわかったので紹介します。
結論
ヘッドノードへログインしsudo service supervisor start
でサービスを手動起動させる必要がある。
supervisor.service
は自動起動有効になっていますが起動してきません。
詳細は以下のリンクをご確認ください。
ワークアラウンド
インスタンス起動時にcron
でサービス開始する設定を仕込めば回避できます。後述します。
対象とされる環境
- AWS ParallelClusterのバージョンは
3.0.0
- OSは
Ubuntu 18.04
とUbuntu 20.04
のみ
原因
- ParallelClusterのデーモン
clustermgtd
がヘッドノードの再起動後にデーモンが再起動しない clusutermgtd
がコンピュートノードのスケールアップを管理しているため、ジョブを登録してもコンピュートノードが起動できない- 根本的な原因はヘッドノードの
supervisord.service
がヘッドノードの再起動にinactive (dead)であるため
状況
ジョブを登録すると以下のメッセージ(REASON)が表示され、コンピュートノードがまったく起動できない状態になりました。
$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 13 cpu-spot test.sh ubuntu PD 0:00 1 (Nodes required for job are DOWN, DRAINED or reserved for jobs in higher priority partitions) 14 cpu-spot test.sh ubuntu PD 0:00 1 (ReqNodeNotAvail, UnavailableNodes:cpu-spot-dy-c5a4xlarge-[1-20])
STATEからノードがdownしていることを確認できます。
$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST cpu-spot* up infinite 20 down~ cpu-spot-dy-c5a4xlarge-[1-20]
原因切り分けのために以下の対応しましたが解決には至りませんでした。
ヘッドノードの再起動後に発生していることがわかり、そこを中心に調査を進めました。
対処
Wikiよりsupervisord.service
サービスが起動しない問題を抱えていることがわかりました。
サービスのステータスを確認します。
systemctl status supervisord.service
inactive (dead)でした。
● supervisord.service - LSB: Start/stop supervisor Loaded: loaded (/etc/init.d/supervisord; generated) Active: inactive (dead) Docs: man:systemd-sysv-generator(8)
サービスを起動します。
sudo service supervisor start systemctl status supervisord.service
active (running)になりました。
● supervisord.service - LSB: Start/stop supervisor Loaded: loaded (/etc/init.d/supervisord; generated) Active: active (running) since Sat 2021-10-09 01:27:30 UTC; 6s ago Docs: man:systemd-sysv-generator(8) Process: 1398 ExecStart=/etc/init.d/supervisord start (code=exited, status=0/SUCCESS) Tasks: 4 (limit: 4631) Memory: 83.2M CGroup: /system.slice/supervisord.service ├─1405 /opt/parallelcluster/pyenv/versions/3.7.10/envs/cookbook_virtualenv/bin/python3.7 /opt/parallelcluster/pyen> ├─1413 /opt/parallelcluster/pyenv/versions/3.7.10/envs/node_virtualenv/bin/python3.7 /opt/parallelcluster/pyenv/ve> └─1420 /opt/parallelcluster/pyenv/versions/3.7.10/envs/cookbook_virtualenv/bin/python /opt/parallelcluster/pyenv/v>
ノードのSTATEはidele%
に変化しました。
$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST cpu-spot* up infinite 20 idle% cpu-spot-dy-c5a4xlarge-[1-20] high-cpu-spot up infinite 10 idle~ high-cpu-spot-dy-c5a24xlarge-[1-10]
キューは捌けていきませんでした。一度scancel
でキュー削除してきれいサッパリにします。
$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 13 cpu-spot test.sh ubuntu PD 0:00 1 (Nodes required for job are DOWN, DRAINED or reserved for jobs in higher priority partitions) 14 cpu-spot test.sh ubuntu PD 0:00 1 (ReqNodeNotAvail, UnavailableNodes:cpu-spot-dy-c5a4xlarge-[1-20])
キューをクリアしました。
$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
テストジョブでコンピュートノード起動確認
テストジョブを投げて動作確認します。
sbatch test.sh
キューに登録されました。
$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 15 cpu-spot test.sh ubuntu CF 0:01 1 cpu-spot-dy-c5a4xlarge-1
STATEがmix~
になりました。この後すぐにdown#
にならなければ問題はほぼほぼ解決したようなものです。
$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST cpu-spot* up infinite 1 mix~ cpu-spot-dy-c5a4xlarge-1 cpu-spot* up infinite 19 idle~ cpu-spot-dy-c5a4xlarge-[2-20]
コンピュートノード起動してくる素振りを見せるだけで2時間ほど原因切り分けしていた身としては感動的な光景です。
正常に起動しました。大きな前進です。
キューは捌けました。
$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
出力結果を返したファイルが作成されています。ホスト名を返すだけのジョブでしたが、コンピュートノードの起動確認において十分な結果です。
$ cat slurm-15.out cpu-spot-dy-c5a4xlarge-1
サービス自動起動しておけばよくないですか?
悲しいことにenabledで自動起動になっています。自動起動したあとに異常終了していたならinactive (dead)ではなくfailedになるはずです。根本的な原因まではわかりませんが、自動起動になっているにもかかわらず起動処理が走らないことに問題があるように思えます。
$ systemctl list-unit-files -t service | grep supervisord supervisord.service generated enabled
ワークアラウンド(cronでサービス起動させる)
ヘッドノード(ECインスタンス)起動時に一度だけサービス起動させるcronを仕込みます。ヘッドノードの停止・開始、再起動してもsupervisord.service
をactive (running)状態に持っていけました。
crontab -e
でcronの設定に以下の1行を追記してください。
@reboot sudo systemctl start supervisord.service
動作確認はヘッドノードの停止・開始後にsystemctl status supervisord.service
でサービスが開始されているか確認してください。
おわりに
GitHubのWikiのタイトルだとわかる人にしかわからないです。シンプルにヘッドノード再起動にコンピュートノードが起動できないという問題を抱えています。検索から当記事がヒットし一次ソースのWikiへたどり着いてもらえば幸いです。 Amazon Linux2、CentOSでは同じ問題は報告されてないため他OSは心配ありません。